Systems and methods for testing source code

ABSTRACT

Methods and systems for testing source code are disclosed. The method includes mounting a shared memory and launching a controller container. The controller container is configured to retrieve a repository identifier of a repository on which the source code is stored, and a build descriptor including build steps and an indicator of a build VM image for generating the build. The method further includes storing the build steps in the shared memory, retrieving the source code from the repository based on the repository identifier, and storing the retrieved source code in the shared memory. The method also includes launching a build container based on the indicator of the build VM image, the build container configured to retrieve the build steps and the source code from the shared memory and perform the build on the source code based on the steps defined in the build steps.

CROSS-REFERENCE TO RELATED APPLICATION(S)

This application is a continuation patent application of U.S. patent application Ser. No. 15/349,711, filed Nov. 11, 2016 and titled “Systems and Methods for Testing Source Code,” the disclosure of which is hereby incorporated herein by reference in its entirety.

TECHNICAL FIELD

The technical field of the present disclosure is testing computer programs. Aspects of the present disclosure are directed to source code testing, and in particular to continuous integration systems.

BACKGROUND

The developments described in this section are known to the inventors. However, unless otherwise indicated, it should not be assumed that any of the developments described in this section qualify as prior art merely by virtue of their inclusion in this section, or that those developments are known to a person of ordinary skill in the art.

Continuous integration (CI) is a software development practice that requires software developers to periodically integrate source code into a shared repository. The shared repository is usually managed by a source code management (SCM) system (also called a revision control or version control system) that tracks and manages source code as it is written and revised. The revisions (also called integrations) added to the SCM system are routinely verified by a CI management system—e.g. as and when they are added to the SCM system—allowing software development teams to detect and correct problems early.

Given different types and versions of computer systems, software developers often require their software applications to work in different environments (e.g., different operating systems, platforms, databases, or programs). For instance, a given software application may be required to be run on WINDOWS, OS400, AIX, LINUX, etc. To account for this, CI management systems generally test the source code in various different target environments.

However, it is often difficult for CI management systems to manage and provide varied build and test environments.

SUMMARY

The appended claims may serve as a summary of the invention.

BRIEF DESCRIPTION OF THE DRAWINGS

FIG. 1 is a block diagram illustrating a network environment in which aspects of the present disclosure may be implemented.

FIG. 2 is a block diagram 200 illustrating the manner in which a CI management system operates to control a given build according to some aspects of the present disclosure.

FIG. 3 is a block diagram illustrating a computer system, which may be used to implement various embodiments.

While the invention is amenable to various modifications and alternative forms, specific embodiments are shown by way of example in the drawings and are described in detail. It should be understood, however, that the drawings and detailed description are not intended to limit the invention to the particular form disclosed. The intention is to cover all modifications, equivalents, and alternatives falling within the spirit and scope of the present invention as defined by the appended claims.

DETAILED DESCRIPTION

Overview

In the following description, for the purposes of explanation, numerous specific details are set forth to provide a thorough understanding of the present invention. It will be apparent, however, that the present invention may be practiced without these specific details. In some instances, well-known structures and devices are shown in block diagram form to avoid unnecessary obscuring.

As noted previously, continuous integration (CI) is the practice of merging working copies of source code from multiple software developers into a shared repository periodically and then using a CI management system to verify the updated source code. The CI management system notifies developers if the source code is successfully verified or if any problems exist with the source code, allowing developers to correct errors as and when they are encountered, thereby reducing rework, cost, and time spent correcting errors at later stages.

CI management systems typically verify source code revisions (also called integrations) by performing a number of automated tests on the source code such as source code style checks, static code analysis, build tests, unit tests, integration tests, performance tests, etc.

The tests are typically run in test environments selected by developers. A test environment usually consists of software and hardware on which a software application is tested. The software may include an operating system, a database server, a browser (if web application), or any other software components required to run the software application. Typically, the test environment replicates/simulates the actual live/production environment on which a software application is finally deployed. If a source code is written for a particular production environment (for example an environment running a Windows2007 operating system, an Oracle database, and a Google Chrome web browser), the developers may instruct the CI management system to test the source code in a test environment similar to that production environment.

In some implementations, CI management systems maintain dedicated physical devices, which are imaged with particular test environments. When an integration needs to be tested, the CI management system determines the test environment(s) in which the integration needs to be built and subsequently transmits build instructions to the physical devices that host the specified test environments. Once the tests are completed, the CI management system retrieves test results from the physical devices and communicates the results to interested parties through one or more communication means.

Maintaining dedicated devices may be feasible when the number of environments and build requests are limited. However, when CI management systems are required to provide a large number of test environments and service multiple build/test requests, it is typically more feasible to utilize virtual machines (VM) instead of dedicated machines. The VMs may be configured to provide individual test environments. Then, depending on the test environment specified for a particular integration, the CI management system may invoke a VM that hosts the corresponding test environment into a physical device and run tests using that VM. Using VMs, CI management systems can utilize the same physical device to run multiple test environments.

When using VMs, CI management systems typically store and manage ‘VM images’. Generally, a VM image is a copy of a hard drive representing a test environment that is used as a template for creating VM instances (also called containers). CI management systems often provide a single image with multiple executable files to offer variations of an environment (such as different versions of an operating system, different types of web browsers or databases, etc.). This simplifies VM image management, but ends up creating very bulky images.

The size of VM images are further increased by adding controllers—programs or modules configured to instruct a container to perform various tasks including: retrieving source code from a shared repository, running required tests on the source code, and communicating test results back to the CI management system.

The VM images thus created are often large, inflexible, and uncustomizable. Moreover, because CI management systems add controllers to VM images before they can be used, CI management systems typically offer a limited number of VM images, thereby limiting the test environments a developer can select. If, on the other hand, CI management systems do decide to offer a vast variety of test environments, this increases the number of VM images the system has to manage and complicates VM image management. Further, even when CI management systems offer a vast variety of test environments, they may still fail to provide the particular combination of hardware and software that is required for a given test environment. Accordingly, there is often a compromise between the number of VM images a CI management system can offer and the number it can manage efficiently.

To overcome one or more of the above-mentioned deficiencies associated with conventional CI management systems, aspects of the present disclosure provide a CI management system that decouples controllers from VM images, thus allowing developers to select any VM image they desire on demand. Moreover, by decoupling the controller from the VM images, the CI management systems described herein simplify VM image management, as the CI management system can simply store controller programs/modules and retrieve VM images directly from external sources on the fly when executing a build.

Accordingly, rather than retrieving a single VM image and launching a single container from that image to run a test/build, the presently disclosed CI management system initiates and launches separate containers to handle the test/build. A first container performs the operations of a controller (i.e., retrieving source code and build instructions and passing build results back to the CI management system), and a second container (specified by the developer) provides the actual build environment in which the retrieved source code is tested based on the build instructions and which passes build results to the controller.

To increase flexibility and security, the presently disclosed CI management system may further segregate the operations of the controller by launching two separate containers—a first container for retrieving build instructions and passing build results back to the CI management system and a second container for retrieving source code from the shared repository. A user-specified third container can then retrieve the source code and the build instructions from the shared repository and use them to perform the required tests.

Using the techniques described herein, the containers are coupled in such a way that they appear as a single container to the software developer requesting the build. In reality, however, they are separate containers that operate together in a manner that is transparent to the developer to perform the required build/testing.

One example CI management system in which features of the present disclosure may be implemented is Bitbucket Pipelines, which is commercially available from Atlassian. Bitbucket Pipelines is integrated with Bitbucket (Atlassian's SCM system). In the description below, Bitbucket Pipelines is used as an example CI management system and Bitbucket is used as an example SCM system for illustrative purposes. It will be appreciated that the various feature and techniques described herein could, with appropriate modifications, be used with alternative CI management systems and SCM systems (e.g., TravisCI, Wercker, buildkite, and Jenkins)

Environment Overview

FIG. 1 illustrates an environment 100 in which aspects of the present disclosure are implemented. The environment 100 includes one or more client devices 102, a source code management (SCM) system 104, a CI management system 106, and a feedback system 108. The client devices 102, SCM system 104, CI management system 106, and feedback system 108 communicate with each other over one or more communication networks 110.

The SCM system 104 stores source code repositories 112 (hereinafter referred to as repositories 112) and manages their content. It also receives/responds to requests from client devices 102 and the CI management system 106 to retrieve/store data in the repositories 112. For example, the SCM system 104 may notify the CI management system 106 when a user updates source code in a repository 112. In addition, the SCM system 104 may receive a request from the CI management system 106 to access source code from a repository 112 that has recently been updated. The SCM system 104, in response, may retrieve the requested source code and forward it to the CI management system 106.

The repositories 112 may include multiple versions of source code files and associated metadata. Typically, the SCM system 104 stores and manages multiple repositories; however, not all repositories may be registered for CI (i.e., to have their source code verified when source code is updated/revised). To differentiate the repositories registered for CI from the rest of the repositories, in one embodiment, the metadata includes an indicator indicating whether CI is enabled or not. The metadata of CI enabled repositories may also include build instructions, which include, among other things, the steps for performing a build, and identifiers of one or more testing environments (or VM images). The ci management system 106 (as described in detail below) may be configured to determine whether CI is required for a repository by inspecting the CI indicator in the metadata and, if such an indicator is present, retrieve the associated build description.

The client devices 102 are configured to communicate with the SCM system 104, the CI management system 106, and the feedback system 108. To that end, in certain embodiments, the client devices 102 include various installed applications such as an SCM client (not shown), a CI client (not shown) and/or a web browser (not shown).

The SCM client may be configured to create local working copies of source code; modify the working copies; commit/push changes made in the working copies to the SCM system 104 (so that the changes are written to the relevant repository 112); fetch (e.g. pull) files from a repository 112 the developer has access to; provide a user interface for reading/writing source code and build instructions.

The CI client may be configured to allow communication between the client device 102 and the CI management system 106. For example, it may allow a developer to register an SCM repository 112 for CI with the CI management system 106. The web browser may be utilized to, for example, view test results provided by the feedback system 108.

In another embodiment, instead of dedicated SCM and CI clients, the client device 102 simply includes a web browser and communicates with the SCM system 104, the CI management system 106, and the feedback system 108 via the web browser.

Only two client devices (102A and 102B) have been illustrated, but normal operation of the SCM system 104 typically involves many more client devices connected to the SCM system 104 to access data from/write data to repositories 112.

The client devices 102 may communicate with the other systems in environment 100 via suitable communication networks. For example, the client devices 102 may communicate with the SCM system via private or public networks, with the CI management system and the feedback system via public networks. It will be appreciated that based on the required implementation, any suitable communication network may be utilized to allow communication between the systems in environment 100.

As described in detail below, the CI management system 106 manage builds. Specifically, the CI management system 106 detects whether source code in a repository 112 that is registered for continuous integration is updated, retrieves a build description from the repository 112, initializes one or more containers to retrieve source code from the repository 112 and test the updated source code based on the build description. The CI management system 106 also retrieves test results from the initialized containers, provides the test results to the feedback system 108, and releases the containers once the test is complete.

To test the source code, the CI management system 106 utilizes one or more computing resources. In some embodiments, the CI management system 106 communicates with a container management system (such as Amazon Web Services EC2 Container Services, Google Kubernetes, etc.) 116 to provision one or more computing resources to perform the build. Alternatively, the CI management system 106 utilizes dedicated on-premises computing resources (not shown) operatively connected to the CI management system 106.

A container management system 116 may be utilized when the CI management system 106 services a large number of clients or software development teams, constantly updating the source code they are working on. Physical on-premises devices may be utilized for lower volumes—i.e., when the CI management system 106 services a small number of clients or software development teams that update their source code infrequently.

In this disclosure, the CI management system 106 is described in association with a container management system 116. However, it will be appreciated that the various feature and techniques described herein could, with appropriate modifications, be used with physical on-premises devices without departing from the scope of the present disclosure.

The feedback system 108 receives notifications such as build updates and test results from the CI management system 106 and communicates/displays these notifications to developers and other interested parties, such as project managers, IT support, etc. The notifications may be communicated to the interested parties via any known communication means such as email, SMS, instant message. Alternatively, the notifications are made accessible on a web server, which the interested parties can access through web browsers on their client devices 102.

In FIG. 1 the SCM system 104, CI management system 106 and feedback system 108 have been depicted as separate systems communicating over one or more networks 110. These systems (or their functionality) may, however, be divided over any number of physical systems communicating in any appropriate manner By way of example, the three systems could be hosted by a single physical computer system.

Build Process

FIG. 2 is a block diagram 200 illustrating the manner in which the CI management system 106 operates to control a given build (i.e. a particular integration).

As shown in FIG. 2, the CI management System 106 of the present embodiment comprises an API module 202, a results module 204 and a build manager 206. These modules may be software modules stored in the memory 360 of one or more the computing devices (such as computer system 350 described below), which are retrieved and executed by the processor 354 when required. Alternatively, the functional modules may be implemented in hardware.

The CI management system 106 may initially interact with the container management system 116 to create a container group 210 for its builds. In AWS EC2 Container Services, this container group is called a Task, whereas in Google Kubernetes it is referred to as a pod. Subsequently, when the CI management system 106 wishes to initiate a build, it may do so within the container group 210. In certain embodiments, the container group 210 may be on a hardware instance which also includes a launch module 212 (i.e., a program or set of instructions). The launch module 212 when executed retrieves VM images from local or external sources 214 and launches containers from the retrieved VM images in the container group 210. When the CI management system 106 is used to retrieve Docker images, the launch module 212 is referred to as a ‘Docker daemon’. It will be appreciated that although the launch module 212 is shown as part of the container group 210 in FIG. 2, it is not logically a part of the container group 210, but on the same hardware instance as the container group 210.

To perform a particular build, the CI management system 106 initializes a number of containers and resources which operate together in the container group 210. In this particular example, three containers are initialized: a controller container 208, a repository container 218, and a build container 224. A shared memory 209 is also mounted in the container group 210 which is accessible to all three containers.

Also involved in a given build/test are the SCM system 104, the feedback system 108, and external sources 214.

For clarity, in FIG. 2 the functional modules, files, VM images, and containers are represented by reference numerals beginning with the number 2, whereas the method steps are represented by reference numerals beginning with the number 3.

The build process begins at step 302 where the CI management system 106 determines that a source code repository maintained by the SCM system 104 has been updated. In certain embodiments, the CI management system 106 polls the SCM system 104 at regular intervals (e.g., every 10 minutes) to identify repositories that have been updated in that interval. In other embodiments, the CI management system 106 automatically receives source code update notifications from the SCM system 104 when a repository is updated.

A notification, polled for or automatically received, may be communicated as an event descriptor to the API module 202. The event descriptor includes information about the repository where the change originated (e.g., a repository ID, a repository name, a repository type, and/or a repository URL), a list of the recent changes made to the repository, and the names of the authors and users that made the changes.

An example event descriptor is illustrated in Table A below. Although a table has been used to illustrate information received in the event descriptor, the relevant information need not be received in a table and could be received in any appropriate format (e.g. a simple text file, a JSON file, an XML file).

TABLE A EXAMPLE EVENT DESCRIPTOR Repository 347kdstjh38764 ID Repository John_Doe/bamboo-bootcamp Name Repository https://api.bitbucket.org/2.0/repositories/John_Doe/bamboo-bootcamp URL Author John_Doe CommitID 7a273a067efbf16ec83d885ad79a7a626f2eec3f Changes  {   “forced”: false,   “old”: {    “links”: {     “commits”: {      “href”: “https://api.bitbucket.org/2.0/repositories/Jdoe/demo2/commits/master”     },     “self”: {      “href”: “https://api.bitbucket.org/2.0/repositories/Jdoe/demo2/refs/branches/master”     },     “html”: {      “href”: “https://bitbucket.org/Jdoe/demo2/branch/master”     }    },    “type”: “branch”,    “target”: {     “hash”: “3c62dce565729e8dda3651557d86be6380a03445”,     “links”: {      “self”: {       “href”: “https://api.bitbucket.org/2.0/repositories/Jdoe/demo2/commit/3c62dce565729e 8dda3651557d86be6380a03445”      },      “html”: {       “href”: “https://bitbucket.org/Jdoe/demo2/commits/3c62dce565729e8dda3651557d86b e6380a03445”       }      },      “author”: {       “raw”: “John Doe”,       “user”: {        “username”: “Jdoe23”,        “type”: “user”,        “uuid”: “{39846whedwqh49873}”,        }       }      },

In certain embodiments, the SCM system 104 communicates the notification via a webhook—a HTTP POST callback that creates and passes the event descriptor to the CI management system 106 when a corresponding repository is updated. For this to work, webhooks are created for the repositories 112 registered for CI.

Once an event descriptor that corresponds to a repository for which CI is required is received, the CI management system 106 retrieves a build description for the repository at step 304. In certain embodiments, the build description may be stored in the SCM repository along with the source code, whereas in other embodiments, the build instructions may be stored in the CI management system. Accordingly, depending on the particular embodiment, the CI management system 106 retrieves the build description from the corresponding SCM repository or from memory associated with the CI management system.

As noted previously, the build description includes information defining one or more VM images to be used for the build (such as image name and in some cases a URL), name of one or more repository branches for testing, and the build steps for the specified branches. If multiple branches are selected, different build steps may be specified for the selected branches. The URL may be present in case the VM image is available at an external source and needs to be retrieved from the external source during the build. Alternatively, if the VM image is stored locally, this field may be absent from the build descriptor. Table B illustrates an example of a build description.

TABLE B BUILD DESCRIPTION VM Image maven:3.3.3 VM Image URL docker.io/maven:3.3.3 Branch(es) Default Step(s) Build bash configure.sh Script/branch mvn clean install

Although the build description is illustrated in a table, the relevant information need not be stored in a table and could be stored in any appropriate format (e.g. a text file such as YAML).

To retrieve data, such as the build description and source code, from the SCM repository, the CI management system 106 may negotiate permissions with the SCM system 104. For example, when a user first registers their repository for CI, the user authorizes the CI management system 106 to retrieve information such as source code and build description from the SCM repository without the need for explicit permissions when the CI management system 106 requires this information. This authorization may be done using any commonly known authorization/permissions techniques or standards, such as OAuth.

According to the OAuth standard, the CI enabled repositories 112 share secrets with the CI management system 106. Based on these secrets, the CI management system 106 generates authorization tokens when it performs a build for a repository. The tokens may be valid for the build duration and may expire once the build is complete.

Thus, using an authorization token, the CI management system 106 can access the SCM repository identified in the event descriptor and retrieve the build description.

In some embodiments, the build description is temporarily stored in the CI management system to be utilized during the build. Once the build is completed, the build description is discarded. Alternatively, it is stored in the CI management system for future builds.

At step 306, the event descriptor and the build description are passed to the results module 204.

Next, at step 307, the results module 204 generates a job. The job request may be created based on the event descriptor and build descriptor. Largely, the job request includes an identifier that uniquely identifies the current job, access permissions for accessing a repository (i.e., the repository identified in the event descriptor), and a field indicating the build status (e.g., whether the build is pending, queued, in progress, successful, completed, failed, etc.). The job request may further include a repository identifier, and a field indicating the build steps that are to be performed during the build. In addition, a revision field may be included that indicates the source code version being tested.

The job request may be in the form of a job descriptor. Table C illustrates an example job descriptor below. Although a table has been used to illustrate information stored in the job descriptor, the relevant information need not be stored in a table and could be stored in any appropriate format (e.g. a simple text file, a JSON file, an XML file, etc.),

TABLE C JOB DESCRIPTOR Job descriptor 8374erjewlkfjdslk3874 ID Auth-token fd4jw4908343943 Status Pending Repository ID 347kdsfjh38764 Revision 5 Build Steps “script_commands”:[  {   “command”:“pwd”,   “name”:“pwd”,   “log_range”:{    “byte_count”:48,    “last_byte_position”:12510,    “first_byte_position”:12463   }  },  {   “command”:“ls -al”,   “name”:“ls -al”,   “log_range”:{    “byte_count”:109,    “last_byte_position”:12619,    “first_byte_position”:12511   }  },  {   “command”:“cd /opt/atlassian/bitbucketci/agent/build”,   “name”:“cd /opt/atlassian/bitbucketci/agent/build”,   “log_range”:{    “byte_count”:46,    “last_byte_position”:12665,    “first_byte_position”:12620   }  },  {   “command”:“pwd”,   “name”:“pwd”,   “log_range”:{    “byte_count”:48,    “last_byte_position”:12713,    “first_byte_position”:12666   }  },  {   “command”:“ls -al”,   “name”:“ls -al”,   }  } ],

The results module 204 may retrieve some of the required information, such as the repository ID from the event descriptors and the build steps from the build instructions. Other information (such as the job descriptor identifier and the authorization token) may be generated by the results module 204. Once a job descriptor is created, it is queued.

At step 308, the results module 204 notifies the build manager 206 that a new job is ready. In one embodiment, the build manager 206 is notified of job requests using a publish-subscribe messaging pattern. In this case, the CI management system 106 characterizes the job requests added by the results module 204 under a specific topic such as ‘pending job requests’ and the build manager 206 subscribes to this particular topic and therefore receives a message when the ‘pending job requests’ topic is updated. In alternate embodiments, the build manager 206 is notified of the job request using any known communication technique such as direct messaging.

The build manager 206 retrieves queued job requests in a particular predetermined order. For example, it may retrieve and initiate job requests based on the order in which they were queued (e.g., first-in-first-out or first-in-last-out). Alternatively, the jobs may be consumed in order of priority.

In any case, the build manager 206 retrieves a queued job request and creates a task definition at step 310, which is used to launch a controller container 208 (hereafter referred to as controller 208).

A task definition is usually required to run container(s) in a container management system 116, such as AWS EC2 Container Service. The task definition typically specifies the VM image(s) to be used for the task, the CPU and memory required for the container, whether any port mappings (that allow the container to have external connectivity) are required, memory that can be accessed by other containers, and environment variables that can be passed to the container for its use. Furthermore, the task definition may include information for mounting one or more non-ephemeral memory volumes for storing data or software that may be used by the container being initiated.

For controller 208, the build manager 206 may generate a task definition that includes:

-   -   a. name and/or identifier of the VM image to be retrieved and         used for the controller,     -   b. location of the controller VM image (e.g., locally cached on         the CI management system or available at an external source),     -   c. the CPU and memory required for the controller instance,     -   d. the networking mode, such as a ‘bridge’ networking mode or a         ‘host’ networking mode that allows the controller to have         external connectivity,     -   e. volume information for retrieving and storing data or         software that is used the controller container to perform its         functions,     -   f. a memory identifier identifying a memory mount that can be         shared between multiple containers, and     -   g. environment variables that are passed to the controller         container once it is launched.

The environment variables may include CI system defined and/or user defined variables, such as, for example, a job descriptor identifier, permission information (e.g., an authorization token for accessing the repository 112 and an authorization token for communicating with the CI management system 106), a location identifier for the build description, and any other user-specified variables such as usernames and passwords to access external sources to retrieve VM images, etc.

Table D illustrates an example task definition for the controller container. It will be appreciated that this is merely an example and that in other embodiments different fields or field values may be utilized without departing from the scope of the present disclosure. Although a table has been used to illustrate information stored in the task definition, the relevant information need not be stored in a table and could be stored in any appropriate format (e.g. a simple text file, a JSON file, an XML file, etc.).

TABLE D EXAMPLE TASK DEFINITION FOR THE CONTROLLER CONTAINER Task definition ID aws:ecs:us-west-1:38734:task-definition/controller-prod-west:34 Network mode Bridge Volume Memory 4096 Volume Essential True Volumes Mount Points { “containerPath”: “/tmp”,    “sourceVolume”: “temporaryDirectory”,    “readOnly”: null   },   {    “containerPath”: “/usr/lib/37845/libltdl.so.7”,    “sourceVolume”: “libltdl”,    “readOnly”: null   },   {    “containerPath”: “/var/run/docker.sock”,    “sourceVolume”: “dockerSocket”,    “readOnly”: null   },   {    “containerPath”: “/usr/bin/docker”,    “sourceVolume”: “dockerExecutable”,    “readOnly”: null}  1. Container Name:  2. Controller  3. Container  4. CommitID=4387498723987qwhdsjkhdajshe324632786      Environment  5. Repository Slug=Whack      Variables  6. Repository Owner=JDoe  7. Branch = master  8. URI=Base URL to the CI system  9. Account ID=d790be83-c700-49cd-b9d7-05a55c6c69d0 10. Repository ID=a43eb225-4b7a-4224-bffc-c2afe974229e 11. Controller ID=3fc77424-eee1-4cd9-bc01-4e036922947b 12. Controller step ID=3656f1bf-49a2-41f9-98ab-     65c2d28a2b45 13. Controller Access= $CIS_Oauth_Access_Token (To     communicate with the CI management system) 14. Repository Access = Repo_Oauth_Access_Token (to     check out the source code from the SCM system) 15. Controller setup image=$Setup_Image (Controller image     with controller software on it) 16. VM image link 17. [ ] 18. VM Image 19. Controller:latest 20. Container CPU 21. 0 22. Container Memory 23. null      reservation 24. Container Volumes 25. “host”: {     “sourcePath”: “/tmp”    },    “name”: “temporaryDirectory”   },   {    “host”: {     “sourcePath”: “/usr/lib/37845/libltdl.so.7”    },    “name”: “libltdl”   },   {    “host”: {     “sourcePath”: “/var/run/docker.sock”    },    “name”: “dockerSocket”   },   {    “host”: {     “sourcePath”: “/usr/bin/docker”    },    “name”: “dockerExecutable”   }    ]

The example task definition includes a number of volumes (i.e., memory) for storing/retrieving data such as libraries, programs and application required during the build. The example illustrates a socket volume and an executable volume. The socket volume includes a file that allows the controller container to request the launch module to initiate other containers (such as the repository container 218 and the build container 224). The container executable volume stores software (i.e., executable instructions) that when executed allows the container to run a container application (e.g., Docker).

In addition to creating the task definition, in some embodiments, the build manager 206 also maintains a record of the task definition and the corresponding job request in a data structure at this step. Once the task is completed, i.e., the build is complete, the build manager 206 may remove the task definition and the corresponding job request from the data structure. This data structure (not shown) may be maintained to keep a record of the tasks that were used to perform jobs and may be queried at a later stage if required.

At step 312, the build manager 206 passes the created task definition to the container management system 116 over communication network 110.

At step 314, the container management system 116 provides the task definitions to the launch module 212 and instructs it to retrieve the controller VM image 216 corresponding to the VM image specified in the task definition.

The launch module 212 inspects the location of the VM image and retrieves the controller VM image 216 from that location. It will be appreciated that the VM image may be retrieved from an external source such as an externally hosted repository of VM images (e.g., Docker hub) or it may be retrieved from a local cache. In certain embodiments, the VM image may be retrieved from an external source in a first instance and then stored locally for future use. At 315, the launch module 212 causes the controller VM image 216 to be executed based on the parameters in the task definition to start the controller container 208.

A shared memory 209 (based on the memory parameters defined in the task definition) is also mounted in the container group 210 at this stage. The controller 208 controls access to this memory. For example, the controller 208 may grant read, write, and/or modify permissions to other containers in the container group 210.

At step 316, the controller 208 retrieves details of the build it has to perform from the results module 204. To that end, the controller 208 passes the environment variables (i.e., the job descriptor identifier and the authorization token for accessing the CI management system 106 that were passed to the controller 208 via the task definition) to the results module 204, requesting the results module 204 to provide the corresponding job request and build description. In the present embodiment, this request is made via the CI management system API module 202.

In certain embodiments, the results module 204 passes the corresponding job descriptor and build description to the controller 208. Before passing the build description, however, the result module 204 may first determine whether the controller 208 is authorized to access this information by comparing the authorization token provided by the controller 208 with a corresponding authorization token maintained by the CI management system, for example.

At step 318, the controller 208 requests the launch module 212 to retrieve a repository container 218. The controller 208 may selects an appropriate repository container 218 based on the repository type (identified from the job descriptor or build description). For example, if the source code repository is a GIT repository, the controller 208 requests the launch module 212 to retrieve and launch a GIT repository container. Alternatively, if the source code repository is another type of repository, such as a MERCURIAL repository, the controller 208 requests the launch module 212 to retrieve and launch a MERCURIAL repository container.

To launch the repository container 218, the controller 208 may create and forward to the launch module 212 a task definition similar to the task definition created by the build manager 206 at step 310. The task definition may include the name and URL for a repository VM image 217, the CPU and memory required for the container, and port mappings (that allow the container to communicate with the SCM system 104). Other fields of the task definition may include an identifier/permissions for the memory 209, and environment variables (including, for example, the repository ID, the source code branch, and an authorization token to access the SCM repository 112). In certain embodiments, these environment variables are provided by the build manager 206 to the controller container 208 and subsequently passed from the controller container 208 to the repository container 218 via the task definition for the repository container 218.

The launch module 212 inspects the VM image URL and retrieves the repository VM image 217 from the URL specified in the task definition. At step 320, the launch module 212 causes the repository VM image 217 to be executed based on the parameters defined in the task definition to start repository container 218. The repository container thus launched is allowed to access the SCM repository 112, has write access to the shared memory 209, and possesses the environment variables defined in the task definition.

Next, at step 322, the repository container 218 communicates with the SCM system 104 to retrieve source code 221 from an SCM repository 112. To that end, the repository container 218 may pass the authorization token is received in the previous step to the SCM system 104. The SCM system 104 inspects this authorization token to determine whether the repository container 218 is allowed access to the SCM repository 112. If permission is granted, the SCM system 104 retrieves the latest updated source code 221 from the SCM repository 112 and forwards it to the repository container 218.

At step 324, the repository container 218 stores the source code 221 in the shared memory 209.

At step 326, the controller 208 is informed that source code 221 is added to the memory 209 via for example a return code (such as 0 for successfully retrieving source code). Subsequently, at step 328, the controller 208 informs the results module 204 that the build process is ‘in progress’. This update is passed to the results module 204 via the API module 202. The results module 204 in turn updates the build status in the job descriptor at step 330. In one example, the build status may be updated from ‘queued’ to ‘in progress.’

At step 332, the controller 208 creates a build script 220 from the build description received at step 316; and at step 333, it stores the build script 220 in the shared memory 209. Typically, the build instructions are stored in the SCM repository 112 in a non-executable file, such as a YAML file. When the CI management system retrieves the YAML file and adds the build steps from the build instructions to the job descriptor, the build steps may be converted from YAML into JSON. However, the build steps are still in a non-executable format.

In one embodiment, the controller 208 extracts build steps from the build description received in step 316 and converts the extracted build steps into an executable file, such as a shell script, in one embodiment this could be a BASH script. This executable file is called the build script 220. Any known techniques may be utilized to generate the build script 220 and these are not described here in detail.

Once the build script 220 is stored in the shared memory 209, the method proceeds to step 334 where the controller 208 requests the launch module 212 to retrieve a build VM image 222. To that end, the controller 208 creates and provides a task definition for a build container 224 to the launch module 212. The task definition may include the name and URL for the build VM image 222 (retrieved from the build description), the CPU and memory required for the build container, and an identifier of the memory 209 shared by the controller 208.

At step 336, the launch module 212 retrieves the build VM image 222 based on the VM image URL in the task definition. The build VM image 222 may be available at an external public source, such as Docker Hub, or it may be available at an external private source, such as user's personal website. Alternatively, the build VM image 222 may be stored locally in the CI management system 106. In any case, the launch module 212 retrieves the VM image 222 from the URL address and launches a build container 224 from the image based on the task definition at step 336.

Next, at step 338 the build container 224 retrieves the source code 221 and the build script 220 from the shared memory 209 and executes the build script 220 on the source code 221. In one embodiment, the build container 224 writes the test results and errors in a file.

At step 340, the controller 208 receives the test results from the build container 224 and passes them to the results module 204 at step 342, via the API module 202. It will be appreciated that the build container 224 may run multiple tests on the source code 221 based on the build script 220. Accordingly, it may generate test results at the end of each test and the method steps 338-342 may be repeated until the tests are completed and the build is complete.

In addition to generating the job descriptor for queuing a job, the result module 204 utilizes the job descriptor to provide build updates to the feedback system 108. Specifically, the results module 204 provides the job descriptor as a placeholder to the feedback system 108. Users may poll this placeholder from time to time to check the build status.

The results module 204 also updates the build status in the job descriptor based on updates it receives during the build process 300. For example, when the job descriptor is queued, the results module 204 may update the build status from ‘pending’ to ‘queued’ in the job descriptor. Similarly, when the controller 208 communicates with the results module at step 316, the results module 204 may update the build status from ‘queued’ to ‘in progress’. Finally, when the build is completed, and the results module 204 receives the results from the controller 208 in step 342, the results module 204 may update the build status from ‘in progress’ to ‘completed’, ‘successful’, or ‘failed’ depending on the result of the build. It also passes the results of the build received from the controller 208 to the feedback system 108.

In certain embodiments, the results module 204 may not retrieve the build description for the repository at step 304. In these cases, the repository container 218 may retrieve the build description from the SCM system 104 at step 322 and store the build description along with the source code 221 in the shared memory 209 at step 324. The controller 208 may thereafter retrieve the build description from the shared memory 209, parse the build description to create the build script 220 and store the build script 220 in the shared memory 209 in step 333.

In some embodiments, the source code verification method described with reference to FIG. 2 may be used to verify source code in different branches of a repository. To that end, a developer may define the same or different VM images for each branch and different or the same build steps for each branch in the build description. At steps 322 and 324, the repository container 218 may then retrieve source code from the specified branches and store the source code as different files in the memory 209. Similarly, at step 332 the controller 208 may build different build scripts corresponding to the different branches (if different build steps were defined for each branch) and store these build scripts in the memory 209. The build container 224 may subsequently retrieve source code files 221 and corresponding build scripts 220 from the memory 209 and perform the builds sequentially.

The method described with reference to FIG. 2 can be used to perform builds on multiple build containers 224. In that case, the build description may include identifiers for multiple VM images 222, and the launch module 212 may retrieve the specified build VM images 222 at steps 334 and 326. Thereafter, method steps 338-342 may be repeated for each build container 224 either simultaneously or sequentially.

In the embodiment described with reference to FIG. 2, the build manager 206 provides instructions to launch the controller container 208, and thereafter the controller 208 provides instructions to launch the repository 218 and build 224 containers. In an alternate embodiment, the build manager 206 may provide instructions, in the form of a pod specification for example, to the container management system 116 (e.g., Google Kubernetes) to retrieve and launch all three containers (i.e., the controller, repository and build instances) in a pod 210.

The instructions include information for launching each container. The container specific information may include the container name, the VM image for the container, environment variables for the container, and resources (e.g., CPU and memory) required by the container. The instructions may also include information about one or more volumes (such as the shared memory 209) that can be mounted by the containers belonging to the pod 210.

Based on the instructions provided by the build manager 206, the container management system 116 subsequently retrieves the VM images for the specified containers (e.g., the controller, repository, and build containers 208, 218, and 224) either from local cache memory or from external sources 214 specified in the instructions. It also mounts the shared memory 209 based on the instructions at this stage.

The build manager 206 may subsequently issue a ‘start’ or ‘run’ command, requesting the pod 210 to begin the build process.

The controller and repository containers 208, 218 within the pod 210 subsequently perform their functions (i.e., retrieve the build script 220 and the source code 221 and store them in the shared memory 209). Once the build script 220 and the source code 221 are stored in the shared memory 209, the build container 224 is instructed to begin its operation (i.e., retrieve the source code 221 and the build steps 220 and perform the build).

Furthermore, in certain embodiments, instead of launching a repository container 218, the controller container 208 may be configured to perform the functions of the controller container 208 and the repository container 218. Specifically, the controller 208 may be configured to retrieve build instructions and source code 221 and store both in the shared memory 209. The controller instance may also retrieve build/test results from the build container 224 and pass them on to the results module 204, via the API module 202.

Implementation Example-Hardware Overview

The operations/techniques described herein are implemented by one or more special-purpose computing systems or devices. For example, in environment 100: SCM system 104 may be provided by a computer system; the client devices 102 are computer systems; the CI management system 106 is provided by one or more computer systems; the feedback system 108 is provided by one or more distributed computing systems, and the computing resources on the cloud computing platform are also provided by one or more computer systems.

A special-purpose computing system may be hard-wired to perform the relevant operations. Alternatively, a special-purpose computing system may include digital electronic devices such as one or more application-specific integrated circuits (ASICs) or field programmable gate arrays (FPGAs) that are persistently programmed to perform the relevant operations. Further alternatively, a special-purpose computing system may include one or more general purpose hardware processors programmed to perform the relevant operations pursuant to program instructions stored in firmware, memory, other storage, or a combination.

A special-purpose computing system may also combine custom hard-wired logic, ASICs, or FPGAs with custom programming to accomplish the relevant operations described herein. A special-purpose computing system may be a desktop computer system, a portable computer system, a handheld device, a networking device or any other device that incorporates hard-wired and/or program logic to implement relevant operations.

By way of example, FIG. 3 provides a block diagram that illustrates one example of a computer system 350 upon which embodiments of the invention may be implemented. Computer system 350 includes a bus 352 or other communication mechanism for communicating information, and a hardware processor 354 coupled with bus 352 for processing information. Hardware processor 354 may be, for example, a general purpose microprocessor, a graphical processing unit, or other processing unit.

Computer system 350 also includes a main memory 356, such as a random access memory (RAM) or other dynamic storage device, coupled to bus 352 for storing information and instructions to be executed by processor 354. Main memory 356 also may be used for storing temporary variables or other intermediate information during execution of instructions to be executed by processor 354. Such instructions, when stored in non-transitory storage media accessible to processor 354, render computer system 350 into a special-purpose machine that is customized to perform the operations specified in the instructions.

Computer system 350 further includes a read only memory (ROM) 358 or other static storage device coupled to bus 352 for storing static information and instructions for processor 354. A storage device 360, such as a magnetic disk or optical disk, is provided and coupled to bus 352 for storing information and instructions.

In case the computer system 350 is the client device 102, the computer system 350 may be coupled via bus 352 to a display 362 (such as an LCD, LED, touch screen display or other display), for displaying information to a computer user. An input device 364, including alphanumeric and other keys, may be coupled to the bus 352 for communicating information and command selections to processor 354. Another type of user input device is cursor control 366, such as a mouse, a trackball, or cursor direction keys for communicating direction information and command selections to processor 354 and for controlling cursor movement on display 362.

According to one embodiment, the techniques herein are performed by computer system 350 in response to processor 354 executing one or more sequences of one or more instructions contained in main memory 356. Such instructions may be read into main memory 356 from another storage medium, such as a remote database. Execution of the sequences of instructions contained in main memory 356 causes processor 354 to perform the process steps described herein. In alternative embodiments, hard-wired circuitry may be used in place of or in combination with software instructions.

The term “storage media” as used herein refers to any non-transitory media that stores data and/or instructions that cause a machine to operate in a specific fashion. Such storage media may comprise non-volatile media and/or volatile media. Non-volatile media includes, for example, optical or magnetic disks, such as storage device 360. Volatile media includes dynamic memory, such as main memory 356. Common forms of storage media include, for example, a floppy disk, a flexible disk, hard disk, solid state drive, magnetic tape, or any other magnetic data storage medium, a CD-ROM, any other optical data storage medium, any physical medium with patterns of holes, a RAM, a PROM, and EPROM, a FLASH-EPROM, NVRAM, any other memory chip or cartridge.

Storage media is distinct from but may be used in conjunction with transmission media. Transmission media participates in transferring information between storage media. For example, transmission media includes coaxial cables, copper wire and fiber optics, including the wires that comprise bus 352. Transmission media can also take the form of acoustic or light waves, such as those generated during radio-wave and infra-red data communications.

Computer system 350 also includes a communication interface 368 coupled to bus 352. Communication interface 368 provides a two-way data communication coupling to a network link 370 that is connected to the communication network 110. For example, communication interface 368 may be an integrated services digital network (ISDN) card, cable modem, satellite modem, etc. As another example, communication interface 368 may be a local area network (LAN) card to provide a data communication connection to a compatible LAN. Wireless links may also be implemented. In any such implementation, communication interface 368 sends and receives electrical, electromagnetic or optical signals that carry digital data streams representing various types of information.

Computer system 350 can send messages and receive data, including program code, through the network(s) 110, network link 370 and communication interface 368. In case the computer system hosts the CI management system 106, the computer system 350 may receive an event notification from the SCM system 104 via the network 110, network link 370, and communication interface 368. The received event notification may be executed by processor 354 as it is received, and/or stored in storage device 360, or other non-volatile storage for later execution.

As described previously, the computer system 350 as described above may be configured in a plurality of useful arrangements. In one arrangement, the computer system 350 is a server computer (such as a computer system hosting the CI management system 106) comprising one or more non-transitory computer-readable data storage media stored with one or more sequences of instructions/software modules which when executed cause the computer to perform the operations/techniques that are described herein.

In the foregoing specification, embodiments of the invention have been described with reference to numerous specific details that may vary from implementation to implementation. Thus, the sole and exclusive indicator of what is the invention, and is intended by the applicants to be the invention, is the set of claims that issue from this application, in the specific form in which such claims issue, including any subsequent correction. Any definitions expressly set forth herein for terms contained in such claims shall govern the meaning of such terms as used in the claims. Hence, no limitation, element, property, feature, advantage or attribute that is not expressly recited in a claim should limit the scope of such claim in any way. The specification and drawings are, accordingly, to be regarded in an illustrative rather than a restrictive sense.

As used herein the terms “include” and “comprise” (and variations of those terms, such as “including”, “includes”, “comprising”, “comprises”, “comprised” and the like) are intended to be inclusive and are not intended to exclude further features, components, integers or steps.

Various features of the disclosure have been described using process steps. The functionality/processing of a given process step could potentially be performed in various different ways and by various different systems or system modules. Furthermore, a given process step could be divided into multiple steps and/or multiple steps could be combined into a single step. Furthermore, the order of the steps can be changed without departing from the scope of the present disclosure. For example, method steps 332 and 333 (i.e., creating and storing the build script 220 in the memory 209) may be performed before step 318 (i.e., launching the repository container 218).

It will be understood that the embodiments disclosed and defined in this specification extends to alternative combinations of two or more of the individual features mentioned or evident from the text or drawings. These different combinations constitute various alternative aspects of the embodiments. 

What is claimed is:
 1. A computer-implemented method for testing source code, the method comprising: mounting a shared memory; launching a controller container configured to retrieve a repository identifier of a repository on which the source code is stored, and a build descriptor including build steps, and an indicator of a build VM image for generating the build; storing the build steps in the shared memory; retrieving the source code from the repository based on the repository identifier; storing the retrieved source code in the shared memory; launching a build container based on the indicator of the build VM image, the build container configured to retrieve the build steps and the source code from the shared memory and perform the build on the source code based on the steps defined in the build steps.
 2. The method of claim 1, further comprising launching a repository container, the repository container configured to perform the steps of retrieving the source code from the repository and storing the retrieved source code in the shared memory.
 3. The method of claim 2, further comprising receiving, at the controller container, permission information for accessing the repository.
 4. The method of claim 3, further comprising: receiving, at the repository container, the repository identifier and the permission information from the controller container, and accessing the repository using the repository identifier and the permission information to retrieve the source code.
 5. The method of claim 1, further comprising: retrieving the build VM image based on the indicator of the build VM image from the build descriptor; and launching the build container from the retrieved build VM image.
 6. The method of claim 1 further comprising: retrieving, by the controller container, results of the build from the build container; and making the results available for inspection.
 7. The method of claim 6, wherein making the results available for inspection comprises forwarding the results to a feedback system.
 8. The method of claim 1, further comprising requesting a container management system to launch a container group, the shared memory being mounted in the container group, and the controller container and the build container being launched in the container group.
 9. The method of claim 1 further comprising detecting that the source code in the repository is updated.
 10. The method of claim 9, wherein the detecting comprises receiving a notification that the source code is updated, the notification comprising the repository identifier.
 11. The method of claim 10, wherein the method for testing the source code is triggered upon receipt of the notification.
 12. A system for testing source code, the system comprising: a processor, a communication interface, and a non-transitory computer-readable storage medium storing sequences of instructions, which when executed by the processor, cause the processor to: cause a controller container to be launched; the controller container configured to: cause a shared memory to be mounted, retrieve a build description associated with a repository on which the source code is stored, the build description comprising build steps and an indicator of a build VM image for generating the build; extract the build steps from the build description and store the build steps in the shared memory, cause a repository container to be launched, the repository container configured to retrieve the source code from the repository and store the retrieved source code in the shared memory; cause a build container to be launched based on the indicator of the build VM image, the build container configured to retrieve the build steps and the source code from the shared memory and perform the build on the source code based on the build steps.
 13. The system of claim 12, wherein the processor is configured to execute instructions that cause the processor to: detect that the repository is updated; and retrieve the build description associated with the repository.
 14. The system of claim 13, wherein to detect that the repository is updated the processor is configured to receive a notification that the repository is updated, the notification comprising a repository identifier.
 15. The system of claim 14 wherein the processor is configured to execute instructions that cause the processor to: generate a job descriptor based on the received notification and the build description, the job descriptor comprising one or more of a status field indicating a status of the build, a permissions field indicating permissions to access the repository, the repository identifier, and the build steps.
 16. The system of claim 12, wherein the processor is configured to execute instructions that cause the processor to pass a job descriptor identifier of the generated job descriptor and permission information to access the system to the controller container.
 17. The system of claim 16, wherein the processor is configured to execute instructions that cause the processor to pass the build description and a repository identifier to the controller container in response to receiving a request from the controller container, the request comprising the job descriptor identifier and the permission information.
 18. The system of claim 15, wherein the processor is configured to execute instructions that cause the processor to receive one or more of build results or build updates from the controller container and update the status of the build based on the build results or the build updates.
 19. The system of claim 12, wherein the processor is configured to execute instructions that cause the processor to request a container management system to launch a container group, the controller container launched within in the container group.
 20. One or more non-transient computer readable storage media storing instructions which, when executed by a processor, cause the processor to: cause a controller container to be launched; the controller container configured to: cause a shared memory to be mounted, retrieve a build description associated with a source code repository from a source code management system, the build description comprising build steps and an indicator of a build VM image for generating the build; extract the build steps from the build description and store the build steps in the shared memory, cause a repository container to be launched, the repository container configured to retrieve source code from the source code repository and store the retrieved source code in the shared memory; cause a build container to be launched based on the indicator of the build VM image, the build container configured to retrieve the build steps and the source code from the shared memory and perform the build on the source code based on the build steps. 